package abd.pr1.Mappers;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Collections;
import java.util.Date;
import java.util.List;

import javax.sql.DataSource;
import javax.swing.table.AbstractTableModel;

import abd.pr1.Models.ComentarioEpisodio;
import abd.pr1.Models.ComentarioSerie;
import abd.pr1.Models.Episodio;
import abd.pr1.Models.Serie;
import abd.pr1.Models.SerieGenero;
import abd.pr1.Models.Usuario;
import abd.pr1.Models.UsuarioEpisodio;
import abd.pr1.Models.VotoEpisodio;
import abd.pr1.Models.VotoSerie;

public class EpisodiosMapper extends AbstractMapper<Episodio, Integer> {

	private static final String[] EPISODIOS_KEY_COLUMN_NAMES = new String[] { "id" };
	private static final String[] EPISODIOS_COLUMN_NAMES = new String[] { "id", "nombre", "sinopsis", "orden", "temporada", "estreno", "id_serie" };
	private static final String EPISODIOS_TABLE_NAME = "episodios";
	
	public EpisodiosMapper(DataSource ds) {
		super(ds);
	}

	@Override
	protected String getTableName() {
		return EPISODIOS_TABLE_NAME;
	}

	@Override
	protected String[] getColumnNames() {
		return EPISODIOS_COLUMN_NAMES;
	}

	@Override
	protected Object[] serializeObject(Episodio object) {
		return new Object[] {object.getId(), object.getNombre(), object.getSinopsis(), object.getOrden(), object.getTemporada(), object.getEstreno(), object.getId_serie()};
	}

	@Override
	protected String[] getKeyColumnNames() {
		return EPISODIOS_KEY_COLUMN_NAMES;
	}

	@Override
	protected Object[] serializeKey(Integer key) {
		return new Object[] {key};
	}

	@Override
	protected Episodio buildObject(ResultSet rs) throws SQLException {
		Integer id = rs.getInt("id");
		String nombre = rs.getString("nombre");
		String sinopsis = rs.getString("sinopsis");
		Integer orden = rs.getInt("orden");
		Integer temporada = rs.getInt("temporada");
		Integer id_serie = rs.getInt("id_serie");
		Date estreno = rs.getDate("estreno");
		
		return new Episodio(id, nombre, sinopsis, orden, temporada, estreno, id_serie);
		
	}

	@Override
	protected Integer getKey(Episodio object) {
		return object.getId();
	}

	@Override
	protected boolean hasAutoincrementKey() {
		// TODO Auto-generated method stub
		return true;
	}

	@Override
	void updateKeys(ResultSet rs, Episodio object) throws SQLException {
		Integer id = rs.getInt(1);
		object.setId(id);	
		
	}
	
	public List<Episodio> getEpisodiosNoVistos(Usuario user, Serie serie){
		
		List<UsuarioEpisodio> episodiosVistos = new UsuariosEpisodiosMapper(ds).queryByExample(new UsuarioEpisodio(user.getId(), null));
		
		QueryCondition[] episodiosVistosConditions= new QueryCondition[episodiosVistos.size()+1];
		for (int i=0;i<episodiosVistos.size();i++) {
			episodiosVistosConditions[i]=new QueryCondition("id", Operator.NEQ, episodiosVistos.get(i).getIdEpisodio());
		}
		episodiosVistosConditions[episodiosVistos.size()]=new QueryCondition("id_serie", Operator.EQ, serie.getId());
		return findByConditions(episodiosVistosConditions);		

	}
	public Double puntuacionMedia(Episodio episodio){
		
		 List<VotoEpisodio> votosEpisodio = new VotosEpisodiosMapper(ds).queryByExample(new VotoEpisodio(null, episodio.getId(), null));
		 int votos=0;	
		 for (VotoEpisodio votoEpisodio : votosEpisodio) {
				votos+=votoEpisodio.getVoto();
			}
		 	if(votosEpisodio.size()>0){		
		  return (double) (votos/votosEpisodio.size());
		 	}
		 	return (double) 0;
	}
	
	public void updateEstrenoSerie(Serie serie){
		
		List<Episodio> epis = this.queryByExample(new Episodio(null,null,null,null,null,null,serie.getId()));
		if(epis.size()>0){
			Date fecha=epis.get(0).getEstreno();
			for (Episodio episodio : epis) {
				if(episodio.getEstreno().before(fecha)){
					fecha=episodio.getEstreno();
				}
			}			
			SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy");
			int anio=Integer.parseInt(dateFormat.format(fecha));
			if(anio!=serie.getEstreno()){
				serie.setEstreno(anio);
				new SeriesMapper(ds).update(serie);
			}
		}
	}
	public String comentariosEpisodio(Episodio episodio){
		List<ComentarioEpisodio> comentariosEpisodio = new ComentariosEpisodiosMapper(ds).queryByExample(new ComentarioEpisodio(null, null, episodio.getId(), null, null));
		String comentariosepisodio="";
		Collections.sort(comentariosEpisodio);
		for (ComentarioEpisodio comentarioEpisodio : comentariosEpisodio) {
			SimpleDateFormat fecha= new SimpleDateFormat("dd/MM/yyyy H:mm:ss");
			
			String usuarionombre= new UsuariosMapper(ds).findById(comentarioEpisodio.getId_usuario()).getNick();
			comentariosepisodio+="Usuario:"+usuarionombre+"\n";
			comentariosepisodio+="Fecha:"+fecha.format(comentarioEpisodio.getFecha())+"\n";
			comentariosepisodio+="Comentario:\n";
			comentariosepisodio+=comentarioEpisodio.getTexto()+"\n";
			comentariosepisodio+="_____________________________________________________________________\n";
		}
		return comentariosepisodio;
	}
	
}
